home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nebula 2
/
Nebula Two.iso
/
SourceCode
/
MiniExamples
/
AppKit
/
AtYourService
/
MyDelegate.m
< prev
next >
Wrap
Text File
|
1995-06-12
|
6KB
|
208 lines
/* This Object is the application's delegate. It is responsible for setting
* itself up as the Delegate for Services requests specific to this
* application. It interfaces with another object which handles services
* preferences
*/
#import <appkit/appkit.h>
#import <defaults/defaults.h>
#import <strings.h>
#import <mach/mach.h>
#import "DefaultHandler.h"
#import "MyDelegate.h"
@implementation MyDelegate
/* Setup Services Delegate and Initialize defaults */
- appDidInit:sender
{
[[NXApp appListener] setServicesDelegate:self];
[defaultHandler readDefaults:self];
return self;
}
/* Brings up the Info panel. Not done on startup because it's in a separate
* interface file. Saves startup time for the user if we do this when they ask
* for it, and not before.
*/
- infoPanel:sender
{
if( ! infoPanel ){
[NXApp loadNibSection:"Information.nib" owner:self];
}
[infoPanel makeKeyAndOrderFront:sender];
return self;
}
/*
* Brings up the Help panel (as above)
*/
- helpPanel:sender
{
if( ! helpPanel ){
[NXApp loadNibSection:"Information.nib" owner:self];
}
[helpPanel makeKeyAndOrderFront:sender];
return self;
}
/* This method sends the data from the sender's "preferred" pasteboard
* (the first on the "types" list) through the Unix sort utility and
* back to both the Ascii and TabText pasteboards.
*/
- sort:(id)pasteboard
userData:(const char *)sortArgs
error:(char **)errorMessage
{
int length, lengths[2], storedOutput[2], thisPboard, currentType;
const char *data;
const char *const *ptypes;
char *myTypes[2];
char *outputPboards[2];
myTypes[0] = (char *) NXAsciiPboardType; storedOutput[0] = 0;
myTypes[1] = (char *) NXTabularTextPboardType; storedOutput[1] = 0;
ptypes=[pasteboard types];
/* calculate over all pasteboardtypes passed in */
for (currentType=0; ptypes[currentType] ; currentType++ )
if ( ( !strcmp(ptypes[currentType],NXTabularTextPboardType) ) ||
( !strcmp(ptypes[currentType],NXAsciiPboardType) )) {
FILE *temp, *process;
int i;
char filename[25], command[256];
char *outbuffer;
[pasteboard readType:ptypes[currentType] data:&data length:&length];
thisPboard= ( strcmp(ptypes[currentType],myTypes[0]) );
outputPboards[thisPboard]=malloc(length+2);
outbuffer=outputPboards[thisPboard];
strncpy(outbuffer, data, length);
if ( outbuffer[length-1] != '\n' ) {
/* Sort data needs a newline at the end, add one */
outbuffer[length] = '\n';
outbuffer[length+1] = '\0';
}
else outbuffer[length]='\0';
/* Make a temporary file to give to Sort */
strcpy(filename,"/tmp/file000000Selection" );
NXGetTempFilename(filename,9);
temp=fopen(filename,"w");
fprintf(temp,outbuffer);
fclose(temp);
/* Call Sort using popen(), The userData supplied has the
* arguments for Sort (see "services" file).
*/
sprintf(command,"sort %s %s %s\n",
[defaultHandler sortFields],sortArgs,filename);
process=popen(command,"r");
for (i=0; ((outbuffer[i]=getc(process)) != EOF); i++)
outbuffer[i+1] = '\0';
lengths[thisPboard] = i;
storedOutput[thisPboard] = 1;
unlink(filename);
pclose(process);
}
if (!storedOutput[0] && !storedOutput[1])
*errorMessage = "No ASCII text found in your selection.";
else {
[pasteboard declareTypes:&myTypes[0] num:2 owner:self];
/* Place the results on the corresponding pasteboards. The two pboards
* are somewhat interchangeable, if one result doesn't exist, send the
* other result in its place. A service must provide all pboard types
* mentioned as "Return Types" in the services section.
*/
[pasteboard writeType:myTypes[0]
data: storedOutput[0] ? outputPboards[0] : outputPboards[1]
length:storedOutput[0] ? lengths[0] : lengths[1]];
[pasteboard writeType:myTypes[1]
data: storedOutput[1] ? outputPboards[1] : outputPboards[0]
length:storedOutput[1] ? lengths[1] : lengths[0]];
if (storedOutput[0]) free(outputPboards[0]);
if (storedOutput[1]) free(outputPboards[1]);
}
return self;
}
/* Another simple service that capitalizes words */
- capitalize:pb userData:(const char *)userData error:(char **)errorMessage
{
char *data;
int length;
const char *const *types;
int hasAscii, i;
types = [pb types];
hasAscii=0;
for (i=0; !hasAscii && types[i] ; i++)
if (!strcmp(types[i], NXAsciiPboardType)) hasAscii=1;
if (hasAscii) {
[pb readType:NXAsciiPboardType data:&data length:&length];
if (data && length) {
int First, i;
char *returnData;
returnData=malloc(length+1);
First=TRUE;
data = strncpy(returnData, data, length);
returnData[length] = '\0';
for (i=1;i<=length;i++) {
if ( NXIsLower(*data) && First ) {
*data = NXToUpper(*data);
First=FALSE;
}
else if (! NXIsAlpha(*data)) First=TRUE;
else First=FALSE;
data++;
}
[pb declareTypes:&NXAsciiPboardType num:1 owner:self];
[pb writeType:NXAsciiPboardType data:returnData length:length];
free(returnData);
}
else *errorMessage = "No data in your selection.";
}
else *errorMessage = "No ASCII text found in your selection.";
return self;
}
/* This is an example of a Service that take no input. It simply returns
* the current date and time.
*/
- timestamp:(id)pasteboard
userData:(const char *)sortArgs
error:(char **)msg
{
long timenum;
char *data;
timenum=time(NULL);
data=asctime(localtime(&timenum));
[pasteboard declareTypes:&NXAsciiPboardType num:1 owner:self];
[pasteboard writeType:NXAsciiPboardType data:data length:25];
return self;
}
@end